package br.com.esporte.view.site.component.listaChamada;

import java.util.Arrays;
import java.util.List;

import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.SimpleAttributeModifier;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.ChoiceRenderer;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.PropertyModel;

import br.com.esporte.business.impl.converter.DateConverter;
import br.com.esporte.model.DiaPraticado;
import br.com.esporte.model.PresencaDiaPraticado;
import br.com.esporte.model.StatusPresencaEnum;
import br.com.esporte.model.Usuario;
import br.com.esporte.view.infra.generic.PaginaAlterarEntidadeComponent;
import br.com.esporte.view.infra.html.HtmlParam;
import br.com.esporte.view.infra.html.JavaScriptParam;
import br.com.esporte.view.site.component.image.ImageRelativePath;
import br.com.esporte.view.site.component.tipoEsporte.TipoEsporteAbstract;
import br.com.esporte.view.site.template.util.ConstantsTemplate;


/**
 * 
 * @author Milton Domingues
 *
 */
public class ListChamadaComponent extends TipoEsporteAbstract {

	private static final long serialVersionUID = -3041310943928809815L;

	private static final String LIST_ACHAMADA_COMPONENT = "listChamadaComponent";
	private static final String IMG_PARTICIPANTE = "imgParticipante";
	private static final String SELECT_STATUS = "statusSelect";
	private static final String STATUS = "status";
	private static final String DATA = "data";
	private static final String FORM = "form";
	private static final String STYLE_CLASS_BASE = "imgListChamada bg-chamada ";
	private static final String CLASS_BG_CHAMADA = "bg-chamada-";

	private static final String QUANTIDADE = "quantidade";
	private static final String CONFIRMADO = "confirmado";
	private static final String NAO_VAI = "naovai";
	private static final String MACHUCADO = "machucado";

	private List<PresencaDiaPraticado> presencas;

	private Usuario usuarioLogado;

	private StatusPresencaEnum status;

	private DiaPraticado diaPraticado;

	private PaginaAlterarEntidadeComponent<PresencaDiaPraticado> paginaAlterar;

	public ListChamadaComponent(String id, DiaPraticado diaPraticado, List<PresencaDiaPraticado> presencas, Usuario usuarioLogado, PaginaAlterarEntidadeComponent<PresencaDiaPraticado> paginaAlterar) {
		super(id);
		setStatus(StatusPresencaEnum.INDEFINIDO);
		this.usuarioLogado = usuarioLogado;
		this.presencas = presencas;
		this.diaPraticado = diaPraticado;
		this.paginaAlterar = paginaAlterar;
		montarComponente();
	}

	private void atualizarComponentInformativo(AjaxRequestTarget target){
		Label confirmado = (Label) get("form:confirmado");
		confirmado.setDefaultModelObject(msgInforQtdStatus(getPresencas(), StatusPresencaEnum.CONFIRMADO));

		Label naovai = (Label) get("form:naovai");
		naovai.setDefaultModelObject(msgInforQtdStatus(getPresencas(), StatusPresencaEnum.NAO_VAI));

		Label machucado = (Label) get("form:machucado");
		machucado.setDefaultModelObject(msgInforQtdStatus(getPresencas(), StatusPresencaEnum.MACHUCADO));

		target.add(confirmado);
		target.add(naovai);
		target.add(machucado);
	}

	private void changeClassItemChamada(ListItem<PresencaDiaPraticado> item, StatusPresencaEnum status){
		item.add(new SimpleAttributeModifier(HtmlParam.CLASS, getClassStyleCahamda(status)));
	}

	private void criarInformacoes(Form<Component> form){
		List<PresencaDiaPraticado> list = getPresencas();

		form.add(new Label(CONFIRMADO, msgInforQtdStatus(list, StatusPresencaEnum.CONFIRMADO)).setOutputMarkupId(true));
		form.add(new Label(NAO_VAI, msgInforQtdStatus(list, StatusPresencaEnum.NAO_VAI)).setOutputMarkupId(true));
		form.add(new Label(MACHUCADO, msgInforQtdStatus(list, StatusPresencaEnum.MACHUCADO)).setOutputMarkupId(true));

		StringBuilder msgQtd = new StringBuilder();
		msgQtd.append("Quantidade: ");
		msgQtd.append(list.size());
		form.add(new Label(QUANTIDADE, msgQtd.toString()));
	}

	private ListView<PresencaDiaPraticado> criarListaChamada(){

		ListView<PresencaDiaPraticado> list = new ListView<PresencaDiaPraticado>(LIST_ACHAMADA_COMPONENT, getPresencas()) {

			private static final long serialVersionUID = -901092323119115601L;

			@Override
			protected void populateItem(ListItem<PresencaDiaPraticado> item) {
				item.setOutputMarkupId(true);

				PresencaDiaPraticado presenca = item.getModelObject();
				String path = ConstantsTemplate.getPathImageUsuario(presenca.getUsuario().getImagem());
				item.add(new ImageRelativePath(IMG_PARTICIPANTE, path));

				changeClassItemChamada(item, presenca.getStatus());

				DropDownChoice<StatusPresencaEnum> dropDown = criarSelectStatus(item);
				Label statusLabel = new Label(STATUS, presenca.getStatus().getDescricao());

				Usuario participante = presenca.getUsuario();
				if(getUsuarioLogado().equals(participante)){
					statusLabel.setVisible(false);
				}else{
					dropDown.setVisible(false);
				}
				item.add(dropDown);
				item.add(statusLabel);
			}
		};
		return list;
	}

	private DropDownChoice<StatusPresencaEnum> criarSelectStatus(ListItem<PresencaDiaPraticado> item){
		ChoiceRenderer<StatusPresencaEnum> choice = new ChoiceRenderer<StatusPresencaEnum>("descricao");
		DropDownChoice<StatusPresencaEnum> tipos = new DropDownChoice<StatusPresencaEnum>(SELECT_STATUS, new PropertyModel<StatusPresencaEnum>(item, "modelObject.status"), Arrays.asList(StatusPresencaEnum.values()), choice);
		tipos.add(new AjaxFormSubmitBehaviorEntidade<PresencaDiaPraticado>(JavaScriptParam.ON_CHANGE, item) {

			private static final long serialVersionUID = 1L;

			@Override
			protected void onError(AjaxRequestTarget target) {

			}

			@Override
			protected void onSubmit(AjaxRequestTarget target) {
				PresencaDiaPraticado presenca = getItem().getModelObject();
				changeClassItemChamada(getItem(), presenca.getStatus());
				target.add(getItem());
				getPaginaAlterar().alterar(presenca);
				atualizarComponentInformativo(target);
			}
		});
		return tipos;
	}

	private String getClassStyleCahamda(StatusPresencaEnum status){
		StringBuilder classStyle = new StringBuilder();
		classStyle.append(STYLE_CLASS_BASE);
		classStyle.append(CLASS_BG_CHAMADA);
		classStyle.append(status.getCodigo());
		return classStyle.toString();
	}

	public DiaPraticado getDiaPraticado() {
		return diaPraticado;
	}

	public PaginaAlterarEntidadeComponent<PresencaDiaPraticado> getPaginaAlterar() {
		return paginaAlterar;
	}

	public List<PresencaDiaPraticado> getPresencas() {
		return presencas;
	}

	public StatusPresencaEnum getStatus() {
		return status;
	}

	public Usuario getUsuarioLogado() {
		return usuarioLogado;
	}

	@Override
	public void montarComponente() {
		Form<Component> form = new Form<Component>(FORM);
		form.add(new Label(DATA, DateConverter.converterDataHoraToString(diaPraticado.getDataHoraInicio())));
		form.add(criarListaChamada());
		criarInformacoes(form);
		add(form);
	}

	private String msgInforQtdStatus(List<PresencaDiaPraticado> list, StatusPresencaEnum status){
		return valorStatusPresenca(status, qtdStatusChamada(status, list));
	}

	private int qtdStatusChamada(StatusPresencaEnum status, List<PresencaDiaPraticado> list){
		int qtd = 0;

		for (PresencaDiaPraticado presencaDiaPraticado : list) {
			if(presencaDiaPraticado.getStatus().getId() == status.getId()) {
				qtd ++;
			}
		}

		return qtd;
	}

	public void setDiaPraticado(DiaPraticado diaPraticado) {
		this.diaPraticado = diaPraticado;
	}

	public void setPaginaAlterar(
			PaginaAlterarEntidadeComponent<PresencaDiaPraticado> paginaAlterar) {
		this.paginaAlterar = paginaAlterar;
	}

	public void setPresencas(List<PresencaDiaPraticado> presencas) {
		this.presencas = presencas;
	}

	public void setStatus(StatusPresencaEnum status) {
		this.status = status;
	}

	public void setUsuarioLogado(Usuario usuarioLogado) {
		this.usuarioLogado = usuarioLogado;
	}

	private String valorStatusPresenca(StatusPresencaEnum status, int qtd){
		StringBuilder statusPresenca = new StringBuilder();
		statusPresenca.append(status.getDescricao());
		statusPresenca.append(":");
		statusPresenca.append(qtd);
		return statusPresenca.toString();
	}

}
